#!/usr/bin/env python
# -*- coding: utf-8 -*-

###
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
###

from exceptions import *
import os, user

class Contribuyente:
    _ruc = None
    _nombre = None
    _tipo_doc_representante = None
    _doc_representante = None
    
    def __init__(self):
        #self._data = []
        self._ruc = ""
        self._nombre = ""
        self._tipo_doc_representante = ""
        self._doc_representante = ""
    
    def load(self, data):
        #self._data = data
        self._ruc = data[0]
        self._nombre = data[1]
        self._tipo_doc_representante = data[2]
        self._doc_representante = data[3]
        
    def set_ruc(self, ruc):
        self._ruc = ruc
    
    def set_nombre(self, nombre):
        self._nombre = nombre

    def set_tipo_documento(self, tipo_documento):
        self._tipo_doc_representante = tipo_documento

    def set_documento(self, documento):
        self._doc_representante = documento

    def get_ruc(self):
        return self._ruc

    def get_nombre(self):
        return self._nombre

    def get_tipo_documento(self):
        return self._tipo_doc_representante

    def get_documento(self):
        return self._doc_representante

    def __str__(self):
        return tostring(self._data)

    def get_data(self):
        return self._ruc+";"+self._nombre+";"+self._tipo_doc_representante+";"+self._doc_representante+";"+"\r\n"
        
    

class ListaContribuyentes:
    archivo = ""
    lista = []

    def __init__(self):
        self.ruta = user.home + os.sep + ".gdimm" + os.sep
        self.filename =  self.ruta + "DatosContrib.csv"
        if not os.path.isdir(self.ruta):
            os.makedirs(self.ruta, mode=0700)

    def count(self):
        return len(self.lista)

    def exists_replace(self, ruc):
        for item in self.lista:
            if item.get_ruc() == ruc :
                return self.lista.index(item)
        return None

    def find_by_ruc(self, ruc):
        for item in self.lista:
            if item.get_ruc() == ruc :
                return item

    def add(self, contribuyente):
        try:
            if not (contribuyente.get_ruc() and contribuyente.get_nombre() and contribuyente.get_tipo_documento() and contribuyente.get_documento()):
                raise Warning('Faltan datos en el contribuyente')
        except AttributeError:
            raise TypeError('El argumento no es un objeto tipo contribuyente')
        
        item_index = self.exists_replace(contribuyente.get_ruc())
        if item_index:
            self.lista[item_index] = contribuyente
        else:
            self.lista.append(contribuyente)

    def remove(self, contribuyente):
        if type(contribuyente)==str:
            oContribuyente = self.find_by_ruc(contribuyente)
        else:
            oContribuyente = contribuyente
        
        if oContribuyente:
            self.lista.remove(oContribuyente)

    def save(self):
        list_size = len(self.lista)
        if list_size > 0:
            file = open(self.filename, "w")
            for item in self.lista:
                file.write(item.get_data())
            file.close()
    
    def load(self):
        if os.path.exists(self.filename):
            file = open(self.filename)
            self.lista = []
            data = file.readline()
            while data != "":
                tokens = data.split(";")
                contrib = Contribuyente()
                contrib.set_ruc(tokens[0])
                contrib.set_nombre(tokens[1])
                contrib.set_tipo_documento(tokens[2])
                contrib.set_documento(tokens[3])
                self.lista.append(contrib)
                data = file.readline()
            file.close()
            
    def get_elements(self):
        return self.lista
        